<?php
namespace app\job;

use app\common\model\Delivery;
use app\common\model\Order;
use think\Db;
use think\Exception;
use think\Log;
use think\queue\Job;

/**
 * 自动确认收货
 * Class AutoConfirm
 * @package app\job
 */
class AutoConfirm{

    public function fire(Job $job, $data){

        //....这里执行具体的任务
        // 有些消息在到达消费者时,可能已经不再需要执行了
        $isJobStillNeedToBeDone = $this->checkToBeDone($data);
        if(!$isJobStillNeedToBeDone){
            $job->delete();
            return;
        }

        $isJobDone = $this->doHelloJob($data);

        if ($isJobDone) {
            // 如果任务执行成功， 记得删除任务
            $job->delete();
        }else{
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了

                $job->delete();

            }
        }

    }

    public function failed($data){

        // ...任务达到最大重试次数后，失败了
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function checkToBeDone($data){
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理...
     */
    private function doHelloJob($data)
    {

        $order_sn = $data;
        $orderModel = new Order();

        $where = [
            'order_sn'  => $order_sn,
            'state'     => 1,
            'pay_state' => 1,
            'ship_state' => 1,
        ];
        $order = $orderModel
            ->where($where)
            ->find();

        if (!$order) {
            return true;
        }

        if ($order['expiretime']){
            return true;
        }

        //确认收货时间
        $confirm_time = time();

        //订单数据
        $orderParam = [
            'ship_state' => 2, //发货状态 0=待发货 1=已发货 2=已收货
            'state' => 2, //订单状态 1=正常 2=完成 3=取消
            'confirm_time'  => $confirm_time,
        ];

        //发货单数据
        $deliveryParam = [
            'confirm_time'  => $confirm_time,
            'status'        => 3, //状态 1=准备发货 2=已发货 3=已确认 4=其他
        ];

        $deliveryModel = new Delivery();

        Db::startTrans();
        try {
            $map = [
                'order_sn'  => $order_sn,
            ];
            //更新订单状态
            $orderModel->save($orderParam,$map);
            //更新发货单状态
            $deliveryModel->save($deliveryParam,$map);
            Db::commit();

            $msg = '自动确认收货！';
            LOG::myLog($msg,$data,'job');
        }catch (Exception $e){
            Db::rollback();

            $msg = '确认收货失败：' . $e->getMessage();
            LOG::myLog($msg,$data,'job');
        }

        return true;
    }

}